﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sisco.AccesoDatos
{
    public class ProblemaDAO
    {
        SiscoEntities conexion;

        public int Registrar(PROBLEMA nuevoProblema)
        {
            using (conexion = new SiscoEntities())
            {
                conexion.PROBLEMA.Add(nuevoProblema);
                return conexion.SaveChanges();
            }
        }

        public void RegistrarSolucion(PROBLEMA problema, string solucion, string usuarioRegistroSolucion)
        {
            using (conexion = new SiscoEntities())
            {
                conexion.PROBLEMA.Attach(problema);

                problema.SOLUCION = solucion;
                problema.ESTADO = "Atendido";
                problema.MODIFICADOPOR = usuarioRegistroSolucion;
                problema.FECHAMODIFICACION = DateTime.Now;
                problema.FECHAREGISTROSOLUCION = DateTime.Now;
                problema.REGISTRADOSOLUCIONPOR = usuarioRegistroSolucion;
                conexion.SaveChanges();
            }
        }

        public void RegistrarRechazo(PROBLEMA problema, string rechazo, string nombreusuariosistema)
        {
            using (conexion = new SiscoEntities())
            {
                conexion.PROBLEMA.Attach(problema);

                problema.RECHAZODESCRIPCION = rechazo;
                problema.ESTADO = "Rechazado";
                problema.MODIFICADOPOR = nombreusuariosistema;
                problema.FECHAMODIFICACION = DateTime.Now;
                problema.FECHAREGISTRORECHAZO = DateTime.Now;
                problema.RECHAZADOPOR = nombreusuariosistema;
                conexion.SaveChanges();
            }
        }

        public List<PROBLEMA> Listar()
        {
            using (conexion = new SiscoEntities())
            {
                return conexion.PROBLEMA.Include("CASOS_PROBL").
                                         Include("PROBLEMA_DETALLE").
                                         Include("PROBLEMA_TIPO").
                                         Include("USUARIO").Where(x => x.ELIMINADO == 0).ToList();
            }
        }

        public DataTable USP_ListarProblema(int? idUsuario, int? idDpto, int? idSucursal, int? idCaso, int? idReparador, int? idTipoProblema, DateTime? fechaRegistroDesde, DateTime? fechaRegistroHasta, string estado)
        {
            DataTable result = new DataTable();

            result.Columns.Add("Id", Type.GetType("System.String"));
            result.Columns.Add("NombreCompleto", Type.GetType("System.String"));
            result.Columns.Add("Sucursal", Type.GetType("System.String"));
            result.Columns.Add("Departamento", Type.GetType("System.String"));
            result.Columns.Add("TipoProblema", Type.GetType("System.String"));
            result.Columns.Add("Estado", Type.GetType("System.String"));
            result.Columns.Add("Descripcion", Type.GetType("System.String"));
            result.Columns.Add("Solucion", Type.GetType("System.String"));
            result.Columns.Add("Caso", Type.GetType("System.String"));
            result.Columns.Add("Asistente", Type.GetType("System.String"));
            result.Columns.Add("FechaRegistro", Type.GetType("System.String"));

            using (conexion = new SiscoEntities())
            {
                var query = conexion.usp_listar_Problema_Rep1(idUsuario, idDpto, idSucursal, idCaso, idReparador, idTipoProblema, fechaRegistroDesde, fechaRegistroHasta, estado);

                DataRow dr;

                foreach (var c in query)
                {
                    dr = result.NewRow();

                    dr[0] = c.Id.ToString();
                    dr[1] = c.Usuario != null ? c.Usuario.Trim() : string.Empty;
                    dr[2] = c.Sucursal != null ? c.Sucursal.Trim() : string.Empty;
                    dr[3] = c.Departamento != null ? c.Departamento.Trim() : string.Empty;
                    dr[4] = c.Tipo != null ? c.Tipo.Trim() : string.Empty;
                    dr[5] = c.Estado != null ? c.Estado.Trim() : string.Empty;
                    dr[6] = c.Descripcion != null ? c.Descripcion.Trim() : string.Empty;
                    dr[7] = c.Solucion != null ? c.Solucion.Trim() : string.Empty;
                    dr[8] = c.Caso != null ? c.Caso.Trim() : string.Empty;
                    dr[9] = c.Asistente != null ? c.Asistente.Trim() : string.Empty;
                    dr[10] = c.FechaRegistro.HasValue ? c.FechaRegistro.GetValueOrDefault().ToShortDateString() : string.Empty;

                    result.Rows.Add(dr);
                }

                return result;
            }
        }

        public DataTable USP_ListarProblema(int? idAsistenteReparador, string estado, DateTime? fechaRegistroDesde, DateTime? fechaRegistroHasta)
        {
            DataTable result = new DataTable();

            result.Columns.Add("IdProblema", Type.GetType("System.String"));
            result.Columns.Add("Usuario", Type.GetType("System.String"));
            result.Columns.Add("TipoProblema", Type.GetType("System.String"));
            result.Columns.Add("Caso", Type.GetType("System.String"));
            result.Columns.Add("Prioridad", Type.GetType("System.String"));
            result.Columns.Add("Estado", Type.GetType("System.String"));
            result.Columns.Add("Programa", Type.GetType("System.String"));
            result.Columns.Add("Reparador", Type.GetType("System.String"));
            result.Columns.Add("Descripcion", Type.GetType("System.String"));
            result.Columns.Add("Observaciones", Type.GetType("System.String"));
            result.Columns.Add("FechaRegistro", Type.GetType("System.String"));
            result.Columns.Add("Solucion", Type.GetType("System.String"));
            result.Columns.Add("FechaRegistroSolucion", Type.GetType("System.String"));

            using (conexion = new SiscoEntities())
            {
                var query = conexion.usp_ListarProblema(idAsistenteReparador, estado, fechaRegistroDesde, fechaRegistroHasta);

                DataRow dr;

                foreach (var c in query)
                {
                    dr = result.NewRow();

                    dr[0] = c.IdProblema.ToString();
                    dr[1] = c.Usuario != null ? c.Usuario.Trim() : string.Empty;
                    dr[2] = c.TipoProblema != null ? c.TipoProblema.Trim() : string.Empty;
                    dr[3] = c.Caso != null ? c.Caso.Trim() : string.Empty;                    
                    dr[4] = c.Prioridad != null ? c.Prioridad.Trim() : string.Empty;
                    dr[5] = c.Estado != null ? c.Estado.Trim() : string.Empty;
                    dr[6] = c.Programa != null ? c.Programa.Trim() : string.Empty;
                    dr[7] = c.Reparador != null ? c.Reparador.Trim() : string.Empty;
                    dr[8] = c.Descripcion != null ? c.Descripcion.Trim() : string.Empty;
                    dr[9] = c.Observaciones != null ? c.Observaciones.Trim() : string.Empty;
                    dr[10] = c.FechaRegistro.HasValue ? c.FechaRegistro.Value.ToShortDateString() : string.Empty;
                    dr[11] = c.Solucion != null ? c.Solucion.Trim() : string.Empty;
                    dr[12] = c.FechaRegistroSolucion.HasValue ? c.FechaRegistroSolucion.Value.ToShortDateString() : string.Empty;

                    result.Rows.Add(dr);
                }

                return result;
            }
        }

        public int Modificar(PROBLEMA selectedProblema, PROBLEMA updProblema, USUARIO usuarioSistema)
        {
            using (conexion = new SiscoEntities())
            {
                conexion.PROBLEMA.Attach(selectedProblema);
                selectedProblema.IDREPARADOR = updProblema.IDREPARADOR;
                selectedProblema.IDUSUARIO = updProblema.IDUSUARIO;
                selectedProblema.DESCRIPCION = updProblema.DESCRIPCION;
                selectedProblema.DESCRIPCIONOBSERVACION = updProblema.DESCRIPCIONOBSERVACION;
                selectedProblema.FECHAMODIFICACION = DateTime.Now;
                selectedProblema.MODIFICADOPOR = usuarioSistema.NOMBRECOMPLETO != null ? usuarioSistema.NOMBRECOMPLETO.Trim() : string.Empty;
                return conexion.SaveChanges();
            }
        }
    }
}
